/**
 * EventServer 的基础对象系统
 */
#pragma once

#include "EventType.h"

#define EVENT_OBJECT_DEBUG_ALL false

/* 基础对象类型 */
typedef struct _EventObject EventObject;
#define EVENT_OBJECT(any) ((EventObject *)any)

/* EventObject 的析构函数 */
typedef void (*EventObjectFinalize)(EventObject *object);
#define FINALIZE(func) ((EventObjectFinalize)func)

struct _EventObject
{
	EventObjectFinalize finalize;
	eint32		    ref_count;
	/* 是否调试该对象 */
	bool debug_flag;
};

/* EventObject 类固有执行方法 */
extern void event_object_init(EventObject *);

/* Object 通用方法 */
extern void event_object_set_finalize(epointer event_object,
				      EventObjectFinalize);
/**
 * 增加一次对象的引用计数，请使用简化的宏 EO_REF(AnyObject *)
 */
extern void event_object_addref(epointer any_object);

/* 减少一次对象的引用，引用为 0 时将自动释放对象 */
extern void event_object_unref(epointer any_object);

/**
 * 对 EventObject 对象进行一次引用
 */
extern EventObject *event_object_reference(EventObject *object);

/**
 * EventObjectReference
 * 引用到 ......
 * @param object : 需要被引用的对象
 * @param ObjectType : 引用的返回类型
 */
#define EO_REF(object, ObjectType) \
	((ObjectType *)event_object_reference(EVENT_OBJECT(object)))

/**
 * 调试对象
 */
extern void event_object_make_debug(EventObject *self);
